package com.pijiu.compose.demo00

import android.os.Bundle
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.viewinterop.AndroidView
import androidx.compose.ui.viewinterop.AndroidViewBinding
import com.pijiu.compose.databinding.LayoutComposeViewbindingBinding
import com.pijiu.compose.ui.theme.HelloComposeTheme

/**
 * 系列教程：Jetpack Compose(1) —— Android 全新的 UI 框架
 *
 * 一、项目中使用 Jetpack Compose
 *      1.1 创建支持 Compose 新应用
 *      1.2 为现有应用设置 Compose
 *      1.3 添加依赖
 * 二、 Compose API 设计原则
 *      2.1 一切皆为函数
 *      2.2 组合优于继承
 *      2.3 单一数据源
 * 三、Compose 与 View 互操作
 *      3.1 Compose 中使用 View
 *      3.1.1 Compose 中使用 AndroidView
 *      3.1.2 Compose 中使用 xml 布局
 *      3.2 View 中使用 Compose
 *
 * https://www.cnblogs.com/joy99/p/18035909
 */
class Demo01Activity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            HelloComposeTheme {
                Greeting("sss") {
                    Toast.makeText(this, "click", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }
}

//本文主要讲解了 Compose 中状态的概念。最后做个小结，
//
//Compose UI 依赖状态变化，触发重组，驱动界面更新。
//使用 remember 和 rememberSaveable 进行状态持久化。remember 保证在 recompose 过程中状态稳定，rememberSaveable 保证 Activity 自动销毁重建过程中状态稳定。
//状态上提，尽可能将 Stateful 组件转换为 Stateless 组件。
//视情况使用 Stateful、StateHoler、ViewModel 管理状态。
//将 LiveData、RxJava、Flow 数据流转换为 State。
@Composable
fun Greeting(name: String, onClick: () -> Unit) {
    //remember 方法的作用是，对其包裹起来的变量值进行缓存，
    // 后续发生重组过程中，不会重新初始化，而是直接从缓存中取。

    //需要注意的一点是：
    // 没有使用委托方式创建的对象，类型是 MutableState 类型，我们用 val 声明；
    // 使用委托方式创建对象，对象类型是 MutableState 包装的对象类型
    //      这里由于赋初始值为 字符串 ，根据类型推导，counter 就是 String 型，
    //      由于要修改 text 的值，所以须使用 var 将其声明为一个可变类型对象。（看起来是为了解决框架导致的bug？）
    var text by remember { mutableStateOf("文本框初始值") }

    //rememberSaveable 在横竖屏旋转，UiMode 切换等场景中，能够对其包裹的数据进行缓存。
    // 那是否说明 rememberSaveable 可以在所有的场景替换 remember ， remember 方法就没用了？
    // rememberSaveable 方法比 remember 方法功能更强劲，代价就是性能要差一些，具体使用根据实际场景来选择。
    var counter by rememberSaveable { mutableStateOf(0) }
    Column {
        Text(
            text = "Hello $name!"
        )
        Button(onClick = {
            onClick.invoke()
        }) {
            Text("I'm a button")
        }
        TextField(value = text, onValueChange = {
            text = it
        })
        MyTextView("android TextView: ${name}")
    }
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    HelloComposeTheme {
        Greeting("Android") {
        }
    }
}

/**
 * 在compose中使用Android View
 */
@Composable
fun MyTextView(text: String) {
    AndroidView(
        //fatory 接收一个 Context 参数，用来构建一个 View
        factory = { context ->
            LinearLayout(context).apply {
                orientation = LinearLayout.VERTICAL
                addView(TextView(context).apply {
                        setText(text)
                    })
                //在android中使用compose
                addView(ComposeView(context).apply {
                    setContent {
                        Column {
                            Text("I'm Composable View")
                            TestComposableViewBinding()
                        }
                    }
                })
            }
        },
        //update 方法是一个 callback, inflate 之后会执行
        update = { view ->
//            view.setText(text)
        }
    )
}

@Composable
fun TestComposableViewBinding() {
    AndroidViewBinding(LayoutComposeViewbindingBinding::inflate) {
        rootView.setOnClickListener {

        }
    }
}

